import { patch } from "./vnode/patch.js";
import Watcher from "./watcher.js";
export function mountedComponent(vm, el) {
  callHook(vm, "beforeMounted");
  let updataComponent = ()=>{
    vm._update(vm._render())
  }

  new Watcher(vm, updataComponent, () => {
    callHook(vm,'updated')
  }, true);
  // vm._update(vm._render()); //vm._render 将render  函数变成vnode  （2）vm.update 将vnode变成 真实dom 放到页面
  callHook(vm, "mounted");
}

export function lifecycleMixin(Vue) {
  Vue.prototype._update = function (vnode) {
    //vnode 变 dom
    // console.log(vnode);
    let vm = this;
    //两个参数  1.旧dom  2vnode
    vm.$el = patch(vm.$el, vnode);
  };
}

//Vue面试题
/* 
Vue渲染流程
（1） 数据初始化 =》对模版进行编译  =》 变成ast语法树  =》变成render字符串 =》变成render函数 =》变成vnode  =》 变真实dom =》放到页面
 
 Vue生命周期   
 1，Vue.mixin({})   //混入
 2.设计模式   订阅发布 
*/

export function callHook(vm, hook) {
  const handlers = vm.$options[hook];
  if (handlers) {
    for (var i = 0; i < handlers.length; i++) {
      handlers[i].call(this); //改变生命周期的this指向
    }
  }
}
